package Gather.StreamExercise.MethodReference.MethodDome;

import java.util.Arrays;
import java.util.Comparator;

/**
 * ClassName:StreamExercise001
 * Package:Gather.StreamExercise.StreamDome003
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/25-13:15
 * @Version:v1.0
 */
public class MethodReference001 {
    /*方法引用：把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体
    *
    * 1.引用处必须是函数式接口
    * 2.被引用的方法必须已经存在
    * 3.被引用方法的形参和返回值需要跟抽象方法保持一致
    * 4.被引用方法的功能要满足当前需求
    *
    *
    * */
    /**方法引用分类
     *
     * 1.引用静态方法
     *      格式：类名::静态方法  Integer::parseInt
     * 2.引用成员方法
     *      格式：对象::成员方法
     *      a.其他类：其他类对象::方法名
     *      b.本类：this::方法名(引用处不能是静态方法)LoginJFrame
     *      c.父类：super::方法名(引用处不能是静态方法)MyJFrame--LoginJFrame
     * 3.引用构造方法
     *      格式：类名::new
     *      范例：Student::new
     * 4.其他调用方式
     *      1.使用类名引用成员方法
     *      格式：String::substring
     *      2.引用数组的构造方法
     *      格式：数据类型[]::方法
     *      范例：int[]::new
     *      */
    public static void main(String[] args) {
        //需求：创建一个数组,进行倒序排列
        Integer[]arr={3,5,4,1,6,2};

        //匿名内部类
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(arr));
        //Lambda表达式
        //因为第二个参数的类型Comparator是函数式接口
        Arrays.sort(arr,(Integer o1, Integer o2)->{
            return o2-o1;});
        System.out.println(Arrays.toString(arr));
        //Lambda表达式简化
        Arrays.sort(arr,(o1,o2)->o2-o1);
        System.out.println(Arrays.toString(arr));

        //方法引用
        /** 1.引用处必须是函数式接口
         * 2.被引用的方法必须已经存在
         * 3.被引用方法的形参和返回值需要跟抽象方法保持一致
         * 4.被引用方法的功能要满足当前需求*/
        //   ::方法引用符
        //表示引用StreamExercise001类里面的subtraction方法
        //把这个方法当做抽象方法的方法体
        Arrays.sort(arr, MethodReference001::subtraction);
        System.out.println(Arrays.toString(arr));

    }

    //可以是Java已经写好的,也可以是一些第三方的工具类
    public static int subtraction(int num1,int num2){
        return num2-num1;
    }
}
